"""
RSI超卖分析主程序
统计虚拟货币过去一个时间段内出现RSI低于30的数据，并在图上进行标注
"""

import os
import sys
from datetime import datetime
from rsi_analyzer import RSIAnalyzer
from data_fetcher import CryptoDataFetcher
import argparse
import logging

# 设置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

def main():
    """主函数"""
    
    # 命令行参数解析
    parser = argparse.ArgumentParser(description='RSI超卖分析工具')
    parser.add_argument('--symbol', type=str, default='BTCUSDT', 
                       help='交易对符号 (默认: BTCUSDT)')
    parser.add_argument('--days', type=int, default=30, 
                       help='分析天数 (默认: 30)')
    parser.add_argument('--interval', type=str, default='1h', 
                       help='K线间隔 (默认: 1h)')
    parser.add_argument('--rsi-period', type=int, default=10, 
                       help='RSI计算周期 (默认: 10)')
    parser.add_argument('--threshold', type=float, default=30.0, 
                       help='RSI超卖阈值 (默认: 30.0)')
    parser.add_argument('--list-symbols', action='store_true', 
                       help='显示热门交易对列表')
    
    args = parser.parse_args()
    
    try:
        # 创建输出目录
        os.makedirs('task1', exist_ok=True)
        
        # 初始化数据获取器
        print("🔄 正在初始化数据获取器...")
        fetcher = CryptoDataFetcher()
        
        # 如果用户要求列出交易对
        if args.list_symbols:
            print("\n📊 热门交易对列表:")
            popular_symbols = fetcher.get_popular_symbols(50)
            for i, symbol in enumerate(popular_symbols, 1):
                print(f"{i:2d}. {symbol}")
            print(f"\n总共 {len(popular_symbols)} 个热门交易对")
            return
        
        # 验证交易对
        symbol = args.symbol.upper()
        if not fetcher.validate_symbol(symbol):
            print(f"❌ 交易对 {symbol} 无效或不存在")
            print("💡 使用 --list-symbols 查看可用的交易对")
            return
        
        # 获取交易对信息
        symbol_info = fetcher.get_symbol_info(symbol)
        if symbol_info:
            print(f"\n📈 交易对信息:")
            print(f"   符号: {symbol_info['symbol']}")
            print(f"   基础货币: {symbol_info['baseAsset']}")
            print(f"   计价货币: {symbol_info['quoteAsset']}")
            print(f"   状态: {symbol_info['status']}")
        
        # 获取历史数据
        print(f"\n🔄 正在获取 {symbol} 最近 {args.days} 天的 {args.interval} 数据...")
        data = fetcher.get_historical_data(symbol, args.interval, args.days)
        
        if data.empty:
            print(f"❌ 未能获取 {symbol} 的数据")
            return
        
        print(f"✅ 成功获取 {len(data)} 条数据记录")
        print(f"   时间范围: {data.index[0]} 到 {data.index[-1]}")
        
        # 初始化RSI分析器
        print(f"\n🔄 正在进行RSI分析 (周期: {args.rsi_period}, 阈值: {args.threshold})...")
        analyzer = RSIAnalyzer(rsi_period=args.rsi_period, oversold_threshold=args.threshold)
        
        # 执行分析
        result = analyzer.analyze_symbol(data, symbol, args.days, save_chart=True)
        
        # 显示结果摘要
        stats = result['stats']
        print(f"\n📊 分析结果摘要:")
        print(f"   超卖信号总数: {stats['total_signals']}")
        if stats['total_signals'] > 0:
            print(f"   平均RSI值: {stats['avg_rsi_value']:.2f}")
            print(f"   最低RSI值: {stats['min_rsi_value']:.2f}")
            print(f"   信号频率: {stats['total_signals']/args.days:.2f} 次/天")
        
        print(f"\n✅ 分析完成！图表已保存到 task1/{symbol}_rsi_analysis.png")
        
        # 询问是否分析其他交易对
        while True:
            choice = input("\n🤔 是否要分析其他交易对? (y/n): ").strip().lower()
            if choice in ['n', 'no', '']:
                break
            elif choice in ['y', 'yes']:
                new_symbol = input("请输入交易对符号 (如 ETHUSDT): ").strip().upper()
                if fetcher.validate_symbol(new_symbol):
                    print(f"\n🔄 正在分析 {new_symbol}...")
                    new_data = fetcher.get_historical_data(new_symbol, args.interval, args.days)
                    if not new_data.empty:
                        analyzer.analyze_symbol(new_data, new_symbol, args.days, save_chart=True)
                        print(f"✅ {new_symbol} 分析完成！")
                    else:
                        print(f"❌ 无法获取 {new_symbol} 的数据")
                else:
                    print(f"❌ 交易对 {new_symbol} 无效")
            else:
                print("请输入 y 或 n")
        
        print("\n🎉 程序运行完成！")
        
    except KeyboardInterrupt:
        print("\n\n⏹️  用户中断程序")
    except Exception as e:
        logger.error(f"程序运行出错: {e}")
        print(f"\n❌ 程序运行出错: {e}")

def interactive_mode():
    """交互式模式"""
    print("=" * 60)
    print("🚀 RSI超卖分析工具 - 交互式模式")
    print("=" * 60)
    
    # 初始化
    fetcher = CryptoDataFetcher()
    
    # 选择交易对
    print("\n📊 热门交易对:")
    popular_symbols = fetcher.get_popular_symbols(20)
    for i, symbol in enumerate(popular_symbols, 1):
        print(f"{i:2d}. {symbol}")
    
    while True:
        try:
            symbol_input = input(f"\n请选择交易对 (输入数字1-{len(popular_symbols)} 或直接输入符号): ").strip()
            
            if symbol_input.isdigit():
                index = int(symbol_input) - 1
                if 0 <= index < len(popular_symbols):
                    symbol = popular_symbols[index]
                    break
                else:
                    print("❌ 数字超出范围")
                    continue
            else:
                symbol = symbol_input.upper()
                if fetcher.validate_symbol(symbol):
                    break
                else:
                    print("❌ 无效的交易对")
                    continue
        except:
            print("❌ 输入格式错误")
            continue
    
    # 选择分析参数
    days = int(input("\n请输入分析天数 (默认30): ") or "30")
    interval = input("请输入K线间隔 (1h/4h/1d, 默认1h): ") or "1h"
    threshold = float(input("请输入RSI超卖阈值 (默认30): ") or "30")
    
    print(f"\n🔄 开始分析 {symbol}...")
    
    # 执行分析
    try:
        data = fetcher.get_historical_data(symbol, interval, days)
        if data.empty:
            print("❌ 无法获取数据")
            return
        
        analyzer = RSIAnalyzer(oversold_threshold=threshold)
        result = analyzer.analyze_symbol(data, symbol, days, save_chart=True)
        
        print("\n✅ 分析完成！")
        
    except Exception as e:
        print(f"❌ 分析过程中出错: {e}")

if __name__ == "__main__":
    if len(sys.argv) == 1:
        # 如果没有命令行参数，启动交互式模式
        interactive_mode()
    else:
        # 有命令行参数，使用命令行模式
        main()
